#!/usr/bin/env python
#####################################
#ver01:2006/07/05
#Add a function to convert NewUI data

import re
import time
import os
import glob
import string
from copy import deepcopy

def NewUiData2BHTC(LotPath,DataFile,TempFileBHTC,TestItemNum,TestItemNames,DigitalTestItemNum,FlagTest):
    """Convert J750 datalog to BHTC dataformat"""
    SiteNum=""
    ArrayDigitalTestItemNums=[]
    ArrayTestValues=[]
    ProgramName=""
    TesterName=""
    Operator=""
    ChannelMap=""
    StartTime=""
    
    #print time.asctime()    
    
    DataPath=os.path.join(LotPath ,FlagTest) 
    os.path.isdir(DataPath)
    os.chdir(DataPath)
    DataFileFH=open(DataFile)
    TempFileBHTCFH=open(TempFileBHTC,"a")
       
    TestItemNames.rstrip()
    ArrayDigitalTestItemNums=re.split(r"\|",DigitalTestItemNum)
    for TempNum in ArrayDigitalTestItemNums:
        TempNum =int(TempNum)
        if (TempNum % 2)==0:
            for Temp in range(TempNum):
                ArrayTestValues.append("*")
        else:
            for Temp in range(TempNum):
                ArrayTestValues.append("****")
       
    CompliedExpressStartTime=re.compile("\d+/\d+/\d+\s+\d+:\d+:\d+")
    CompliedExpressSiteNum=re.compile(r'Site Number:')
    CompliedExpressProgramName=re.compile(r'Job Name:')
    CompliedExpressOperator=re.compile(r'Operator:')
    CompliedExpressTesterName=re.compile(r'Node Name:')
    CompliedExpressChannelMap=re.compile(r'Channel map:')
    CompliedExpressDevice=re.compile(r'Device#:')
    CompliedExpressIdstring=re.compile(r'IDString:')
    CompliedExpressCoordinate=re.compile("\s+Coordinate:")
    CompliedExpressDcParameter=re.compile("\s+\d+\s+\d+\s+(PASS|FAIL)\s+\w+\s+\w+\s+\d+\s+((-){0,1}\d+(\.){0,1}\d+\s+\w+\s+){4}\d+$")
    CompliedExpressFunction=re.compile("\s+\d+\s+\d+\s+(PASS|FAIL)\s+\w+\s+\w+$")
    CompliedExpressBin=re.compile("\s+Site\s+Sort\s+Bin")
    CompliedExpressSpace=re.compile("\s+")
    CompliedExpressV=re.compile("^V\b")
    CompliedExpressmA=re.compile("^mA\b")
    CompliedExpressA=re.compile("^A\b")
    CompliedExpressFail=re.compile(r'FAIL')
    CompliedExpressBinSort=re.compile("\s+\d+\s+\d+\s+\d+")
    CompliedExpressLine=re.compile(r'==========================')
    CompliedExpressSplitIdstring=re.compile("[:|_]")
    CompliedExpressSplitCoordinate=re.compile("[:|_|_X|Y]")
    
    
    FlagSiteNum=0
    FlagProgramName=0
    FlagTesterName=0
    FlagOperator=0
    FlagChannelMap=0
    FlagStartTime=0
       
    while True:
        
        FlagDevice=1
        Line =DataFileFH.readline()
        
        #############################################
        # Zero length indicates EOF
        #############################################
        if len(Line) == 0: 
            break
        
        Line=Line.rstrip()
        if not(FlagSiteNum and FlagProgramName and FlagTesterName and FlagOperator and FlagChannelMap and FlagStartTime):
            if CompliedExpressSiteNum.search(Line):
                Line=DataFileFH.readline()
                Line=Line.rstrip()
                if re.search(r',',Line):
                    TempArray=re.split(r',',Line)
                    SiteNum=len(TempArray)
                    SiteNum=int(SiteNum)
                    FlagSiteNum=1
                    
                else:
                    TempArray=re.split("\s+",Line)
                    SiteNum=TempArray[1]
                    SiteNum=int(SiteNum)+1
                    FlagSiteNum=1
                    
            elif CompliedExpressProgramName.search(Line):
                
                TempArray=re.split(r":",Line)
                ProgramName=TempArray[1]
                ProgramName=ProgramName.lstrip()
                FlagProgramName=1
                
            elif CompliedExpressTesterName.search(Line):
                TempArray=re.split(r":",Line)
                TesterName=TempArray[1]
                TesterName=TesterName.lstrip()
                FlagTesterName=1
                
            elif CompliedExpressOperator.search(Line):
                TempArray=re.split(r":",Line)
                Operator=TempArray[1]
                Operator=Operator.lstrip()
                FlagOperator=1
                
            elif CompliedExpressChannelMap.search(Line):
                TempArray=re.split(r":",Line)
                ChanneMap=TempArray[1]
                ChanneMap=ChanneMap.lstrip()
                FlagChannelMap=1
                
            elif re.search("\d+/\d+/\d+\s\d+:\d+:\d+",Line):
                StartTime=Line
                FlagStartTime=1
            
    
        else:
            
            ##########################################################
            #Find Every device data
            ##########################################################
            if ((CompliedExpressDevice.search(Line)) and FlagDevice):
                TestValues=[""]*SiteNum
                for Temp in range(SiteNum):
                    TestValues[Temp]=deepcopy(ArrayTestValues)
                    
                CoordX=[""]*SiteNum
                CoordY=[""]*SiteNum
                AbsCoordX=[""]*SiteNum
                AbsCoordY=[""]*SiteNum
                Sn=[""]*SiteNum
                Bin=["0"]*SiteNum
                
                
                while FlagDevice:           
                    Line =DataFileFH.readline()
                    Line=Line.rstrip()
                    if CompliedExpressCoordinate.search(Line):
                        #############################################################
                        #Get Coordinate of X,Y
                        #############################################################
                            
                        TempCoord=CompliedExpressSplitCoordinate.split(Line)
                           
                        for Index in range(SiteNum):
                            CoordX[Index]=int(TempCoord[2+Index*3])
                            CoordY[Index]=int(TempCoord[3+Index*3]) 
                        
                            AbsCoordX[Index]=abs(CoordX[Index])
                            AbsCoordY[Index]=abs(CoordY[Index])
                            
                            if 0 <= AbsCoordX[Index] < 10 :
                                AbsCoordX[Index]="".join(("00",str(AbsCoordX[Index])))
                            elif 10 <= AbsCoordX[Index] < 100:
                                AbsCoordX[Index]="".join(("0",str(AbsCoordX[Index])))
                                
                            if CoordX[Index] < 0:
                                AbsCoordX[Index]="".join(("-",str(AbsCoordX[Index])))
                            else:
                                AbsCoordX[Index]="".join(("+",str(AbsCoordX[Index])))
                                   
                            if 0 <= AbsCoordY[Index] < 10 :
                                AbsCoordY[Index]="".join(("00",str(AbsCoordY[Index])))
                            elif 10 <= AbsCoordY[Index] < 100:
                                AbsCoordY[Index]="".join(("0",str(AbsCoordY[Index])))
                                   
                            if CoordY[Index] < 0:
                                AbsCoordY[Index]="".join(("-",str(AbsCoordY[Index])))
                            else:
                                AbsCoordY[Index]="".join(("+",str(AbsCoordY[Index])))                    
                               
                    elif CompliedExpressIdstring.search(Line):
                        TempIdstr=CompliedExpressSplitIdstring.split(Line)
                        IndexForCoord=""
                        for Index in range(len(TempIdstr)):
                            if TempIdstr[Index]=="Coordinate":
                                IndexForCoord=Index
                                break
                                
                        #########################################
                        #Get Every Site SN
                        ########################################    
                        for IndexSiteNum in range(SiteNum):
                            for IndexIdstr in range(1,len(TempIdstr)):
                                if IndexIdstr==IndexForCoord:
                                    Sn[IndexSiteNum]="".join((Sn[IndexSiteNum],AbsCoordX[IndexSiteNum],AbsCoordY[IndexSiteNum]))
                                else:
                                    Sn[IndexSiteNum]="".join((Sn[IndexSiteNum],TempIdstr[IndexIdstr]))
                            
                    ############################################################
                    #Parameter test value
                    ############################################################
                    elif CompliedExpressDcParameter.search(Line):
                        TempArray= CompliedExpressSpace.split(Line)
                        # Number Site Result    Test Name     Pin   Channel     Low          Measured          High           Force        Loc
                        if CompliedExpressV.search(TempArray[10]):
                            TempArray[9]=TempArray*1000
                        elif CompliedExpressmA.search(TempArray[10]):
                            TempArray[9]=TempArray*1000
                        elif CompliedExpressA.search(TempArray[10]):
                            TempArray[9]=TempArray*1000000
                                
                        if CompliedExpressFail.search(TempArray[3]):
                            TempArray[9]="".join((TempArray[9],"<F>"))
                                
                        #Site=int(TempArray[2])                        
                        TestValues[int(TempArray[2])][int(TempArray[1])]=TempArray[9]                                
                                
                    ##########################################################    
                    #Function Test Result
                    ##########################################################
                    elif CompliedExpressFunction.search(Line):
                        TempArray= CompliedExpressSpace.split(Line)
                        Site=int(TempArray[2])
                        TestValues[Site][int(TempArray[1])]=TempArray[3]
                                
                    #########################################################
                    #Get Bin code
                    #########################################################
                    elif CompliedExpressBin.search(Line):                        
                        while True:
                            Line =DataFileFH.readline()
                            if CompliedExpressBinSort.search(Line):
                                TempBin=CompliedExpressSpace.split(Line)
                                Bin[int(TempBin[1])]=int(TempBin[3])
                            elif CompliedExpressLine.search(Line):
                                break                        
                        FlagDevice=0
                ########################################################################
                # TempFileBHTCFH.write out the every test item value of every device to tmp BHTC file
                ########################################################################
                   
                for IndexSiteNum in  range(SiteNum):
                    if int(Bin[IndexSiteNum]):
                        TempFileBHTCFH.write("%3d |%3d |%4d |%4d |%3d |%24s |" % (1,int(Bin[IndexSiteNum]),int(CoordX[IndexSiteNum]),int(CoordY[IndexSiteNum]),IndexSiteNum,Sn[IndexSiteNum]),)
                        for IndexValueNum in range(int(TestItemNum)):
                            TempFileBHTCFH.write ("%13s |" % TestValues[IndexSiteNum][IndexValueNum],)
                        TempFileBHTCFH.write ("\n",)
                       
    #           continue
           
        
    TempFileBHTCFH.close
    DataFileFH.close
    if FlagTest is "data" :
        return(0,StartTime,ProgramName,TesterName,Operator,ChannelMap);
    else:
        return(0,ProgramName,TesterName,Operator,ChannelMap)
    
    #print time.asctime()


def Data2BHTC(LotPath,DataFile,TempFileBHTC,TestItemNum,TestItemNames,DigitalTestItemNum,FlagTest):
    """Convert J750 datalog to BHTC dataformat"""
    SiteNum=""
    ArrayDigitalTestItemNums=[]
    ArrayTestValues=[]
    ProgramName=""
    TesterName=""
    Operator=""
    ChannelMap=""
    StartTime=""
    
    #print time.asctime()    
    
    DataPath=os.path.join(LotPath ,FlagTest)    
    os.chdir(DataPath)
    DataFileFH=open(DataFile)
    TempFileBHTCFH=open(TempFileBHTC,"a")
       
    TestItemNames.rstrip()
    ArrayDigitalTestItemNums=re.split(r"\|",DigitalTestItemNum)
    for TempNum in ArrayDigitalTestItemNums:
        TempNum =int(TempNum)
        if (TempNum % 2)==0:
            for Temp in range(TempNum):
                ArrayTestValues.append("*")
        else:
            for Temp in range(TempNum):
                ArrayTestValues.append("****")
       
    CompliedExpressStartTime=re.compile("\d+/\d+/\d+\s+\d+:\d+:\d+")
    CompliedExpressSiteNum=re.compile(r'Site Number:')
    CompliedExpressProgramName=re.compile(r'Job Name:')
    CompliedExpressOperator=re.compile(r'Operator:')
    CompliedExpressTesterName=re.compile(r'Node Name:')
    CompliedExpressChannelMap=re.compile(r'Channel map:')
    CompliedExpressDevice=re.compile(r'Device#:')
    CompliedExpressIdstring=re.compile(r'IDString:')
    CompliedExpressDcParameter=re.compile("\s+\d+\s+\d+\s+(PASS|FAIL)\s+\w+\s+\w+\s+\d+\s+((-){0,1}\d+(\.){0,1}\d+\s+\w+\s+){4}\d+\s+$")
    CompliedExpressFunction=re.compile("\s+\d+\s+\d+\s+(PASS|FAIL)\s+\w+\s+")
    CompliedExpressBin=re.compile("\s+Site\s+Sort\s+Bin")
    CompliedExpressSpace=re.compile("\s+")
    CompliedExpressV=re.compile("^V\b")
    CompliedExpressmA=re.compile("^mA\b")
    CompliedExpressA=re.compile("^A\b")
    CompliedExpressFail=re.compile(r'FAIL')
    CompliedExpressBinSort=re.compile("\s+\d+\s+\d+\s+\d+")
    CompliedExpressLine=re.compile(r'==========================')
    CompliedExpressSplitIdstring=re.compile("[:|_|_X|Y]")
    
    
    FlagSiteNum=0
    FlagProgramName=0
    FlagTesterName=0
    FlagOperator=0
    FlagChannelMap=0
    FlagStartTime=0
       
    while True:
        
        FlagDevice=1
        Line =DataFileFH.readline()
        
        #############################################
        # Zero length indicates EOF
        #############################################
        if len(Line) == 0: 
            break
        
        Line=Line.rstrip()
        if not(FlagSiteNum and FlagProgramName and FlagTesterName and FlagOperator and FlagChannelMap and FlagStartTime):
            if CompliedExpressSiteNum.search(Line):
                Line=DataFileFH.readline()
                Line=Line.rstrip()
                if re.search(r',',Line):
                    TempArray=re.split(r',',Line)
                    SiteNum=len(TempArray)
                    SiteNum=int(SiteNum)
                    FlagSiteNum=1
                    
                else:
                    TempArray=re.split("\s+",Line)
                    SiteNum=TempArray[1]
                    SiteNum=int(SiteNum)+1
                    FlagSiteNum=1
                    
            elif CompliedExpressProgramName.search(Line):
                
                TempArray=re.split(r":",Line)
                ProgramName=TempArray[1]
                ProgramName=ProgramName.lstrip()
                FlagProgramName=1
                
            elif CompliedExpressTesterName.search(Line):
                TempArray=re.split(r":",Line)
                TesterName=TempArray[1]
                TesterName=TesterName.lstrip()
                FlagTesterName=1
                
            elif CompliedExpressOperator.search(Line):
                TempArray=re.split(r":",Line)
                Operator=TempArray[1]
                Operator=Operator.lstrip()
                FlagOperator=1
                
            elif CompliedExpressChannelMap.search(Line):
                TempArray=re.split(r":",Line)
                ChanneMap=TempArray[1]
                ChanneMap=ChanneMap.lstrip()
                FlagChannelMap=1
                
            elif re.search("\d+/\d+/\d+\s\d+:\d+:\d+",Line):
                StartTime=Line
                FlagStartTime=1
            
    
        else:
            
            ##########################################################
            #Find Every device data
            ##########################################################
            if ((CompliedExpressDevice.search(Line)) and FlagDevice):
                TestValues=[""]*SiteNum
                for Temp in range(SiteNum):
                    TestValues[Temp]=deepcopy(ArrayTestValues)
                    
                CoordX=[""]*SiteNum
                CoordY=[""]*SiteNum
                AbsCoordX=[""]*SiteNum
                AbsCoordY=[""]*SiteNum
                Sn=[""]*SiteNum
                Bin=["0"]*SiteNum
                
                
                while FlagDevice:           
                    
                    Line=DataFileFH.readline()
                    if len(Line)==0:
                        break
                    else:
                        if not(CompliedExpressIdstring.search(Line)):
                            
                            ############################################################
                            #Parameter test value
                            ############################################################
                            if CompliedExpressDcParameter.search(Line):
                                TempArray= CompliedExpressSpace.split(Line)
                                # Number Site Result    Test Name     Pin   Channel     Low          Measured          High           Force        Loc
                                if CompliedExpressV.search(TempArray[10]):
                                    TempArray[9]=TempArray*1000
                                elif CompliedExpressmA.search(TempArray[10]):
                                    TempArray[9]=TempArray*1000
                                elif CompliedExpressA.search(TempArray[10]):
                                    TempArray[9]=TempArray*1000000
                                
                                if CompliedExpressFail.search(TempArray[3]):
                                    TempArray[9]="".join((TempArray[9],"<F>"))
                                
                                Site=int(TempArray[2])                        
                                TestValues[Site][int(TempArray[1])]=TempArray[9]                                
                                
                            ##########################################################    
                            #Function Test Result
                            ##########################################################
                            elif CompliedExpressFunction.search(Line):
                                TempArray= CompliedExpressSpace.split(Line)
                                Site=int(TempArray[2])
                                TestValues[Site][int(TempArray[1])]=TempArray[3]
                                
                            #########################################################
                            #Get Bin code
                            #########################################################
                            elif CompliedExpressBin.search(Line):                        
                               while True:
                                    Line =DataFileFH.readline()
                                    if CompliedExpressBinSort.search(Line):
                                        TempBin=CompliedExpressSpace.split(Line)
                                        Bin[int(TempBin[1])]=int(TempBin[3])
                                    elif CompliedExpressLine.search(Line):
                                        break
                                   
                        else:
                            #############################################################
                            #Get Coordinate of X,Y
                            #############################################################
                            
                            TempIdstr=CompliedExpressSplitIdstring.split(Line)
                           
                            for Index in range(SiteNum):
                                CoordX[Index]=int(TempIdstr[5+Index*3])
                                CoordY[Index]=int(TempIdstr[6+Index*3]) 
                            #########################################
                            #Get Every Site SN
                            ########################################
                                AbsCoordX[Index]=abs(CoordX[Index])
                                AbsCoordY[Index]=abs(CoordY[Index])
                               
                                if 0 <= AbsCoordX[Index] < 10 :
                                    AbsCoordX[Index]="".join(("00",str(AbsCoordX[Index])))
                                elif 10 <= AbsCoordX[Index] < 100:
                                    AbsCoordX[Index]="".join(("0",str(AbsCoordX[Index])))
                                    
                                if CoordX[Index] < 0:
                                    AbsCoordX[Index]="".join(("-",str(AbsCoordX[Index])))
                                else:
                                    AbsCoordX[Index]="".join(("+",str(AbsCoordX[Index])))
                                   
                                if 0 <= AbsCoordY[Index] < 10 :
                                    AbsCoordY[Index]="".join(("00",str(AbsCoordY[Index])))
                                elif 10 <= AbsCoordY[Index] < 100:
                                    AbsCoordY[Index]="".join(("0",str(AbsCoordY[Index])))
                                   
                                if CoordY[Index] < 0:
                                    AbsCoordY[Index]="".join(("-",str(AbsCoordY[Index])))
                                else:
                                    AbsCoordY[Index]="".join(("+",str(AbsCoordY[Index])))                    
                               
                               
                                Sn[Index]="".join((TempIdstr[1],TempIdstr[2],TempIdstr[3],AbsCoordX[Index],AbsCoordY[Index]))
                               
                            FlagDevice=0
                ########################################################################
                # TempFileBHTCFH.write out the every test item value of every device to tmp BHTC file
                ########################################################################
                   
                for IndexSiteNum in  range(SiteNum):
                    if int(Bin[IndexSiteNum]):
                        TempFileBHTCFH.write("%3d |%3d |%4d |%4d |%3d |%24s |" % (1,int(Bin[IndexSiteNum]),int(CoordX[IndexSiteNum]),int(CoordY[IndexSiteNum]),IndexSiteNum,Sn[IndexSiteNum]),)
                        for IndexValueNum in range(int(TestItemNum)):
                            TempFileBHTCFH.write ("%13s |" % TestValues[IndexSiteNum][IndexValueNum],)
                        TempFileBHTCFH.write ("\n",)
                       
    #            continue
           
        
    TempFileBHTCFH.close
    DataFileFH.close
    if FlagTest is "data" :
        return(0,StartTime,ProgramName,TesterName,Operator,ChannelMap);
    else:
        return(0,ProgramName,TesterName,Operator,ChannelMap)
    
    #print time.asctime()


def main():    
    #Data2BHTC(LotPath,DataFile,TempFileBHTC,TestItemNum,TestItemNames,DigitalTestItemNum,FlagTest)
    NewUiData2BHTC(r"F:\DataProcess\testdata\hed0409_bv65\h5z5685","HED0409_bv65_8Site_Sort1_h5z5685-03_060629_1614_SAPPHIRE.data","tmpbhtc.bhtc","24","cont_gnd_mrst|cont_gnd_mclk|cont_gnd_tp1|cont_gnd_tp2|cont_gnd_AIT|cont_gnd_vppl|cont_gnd_IO1|cont_gnd_IO2|cont_gnd_vpph|cont_vdd_mrst|cont_vdd_mclk|cont_vdd_tp1|cont_vdd_tp2|cont_vdd_AIT|cont_vdd_IO1|cont_vdd_IO2|Idd_rst0_VDD|lil_TP_Ait_tp2|lil_TP_Ait_tp1|lil_TP_Ait_AIT|lil_Rst_Clk_mclk|lil_Rst_Clk_mrst|lil_io1_io2_IO2|lil_io1_io2_IO1||lih_TP_Ait_tp2|lih_TP_Ait_tp1|lih_TP_Ait_AIT|lih_Rst_Clk_mclk|lih_Rst_Clk_mrst|lih_io1_io2_IO2|lih_io1_io2_IO1|Sort2a|RFP|Sort2b|Idd_normal|Idd_normal_VDD|Idd_normal|RFP|Sort2b|SN_HED0409|AI_INI|AI_TEST_MODE|Ai_far_function_R2C_L1|Ai_far_function_C2R_L1|Ai_near_function_R2C_L1|Ai_near_function_C2R_L1|Ai_far_function_R2C_L2|Ai_far_function_C2R_L2|Ai_near_function_R2C_L2|Ai_near_function_C2R_L2","31|4|1|14","data")
  

if __name__ == '__main__':
    main()

    